﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using WebArchivosTelefonica.Jerarquias;
using System.Collections.ObjectModel;
using System.IO;

namespace WebArchivosTelefonica.Jerarquias
{
	/// <summary>
	/// Administrador de fuentes de datos
	/// </summary>
	public class AdministradorProyectos : IAdministradorProyectos, IDisposable
	{
		private IFabricaLinqDataSource _fabricaLinqDataSource;
		private const string _nombreEntidadCliente = "Clientes";
		private const string _nombreEntidadProyecto = "Proyectos";
		private const string _nombreEntidadCarpetaProyecto = "JerarquiaCarpetas";
		private const string _nombreEntidadEstadoProyecto = "EstadoProyecto";
		private IEntidadLinqDataContext _contexto;

		/// <summary>
		/// Constructor por defecto
		/// </summary>
		public AdministradorProyectos(IFabricaLinqDataSource fabricaLinqDataSource, IEntidadLinqDataContext contexto)
		{
			_fabricaLinqDataSource = fabricaLinqDataSource;
			_contexto = contexto;
		}

		#region IAdministradorProyectos Members

		/// <summary>
		/// retorna datasource de clientes desde base de datos
		/// </summary>
		/// <returns></returns>
		public ILinqDataSource GetDataSourceClientes()
		{
			ILinqDataSource dataSourceClientes = _fabricaLinqDataSource.Construir();
			dataSourceClientes.TableName = _nombreEntidadCliente;
			dataSourceClientes.EnableViewState = true;
			return dataSourceClientes;
		}

		/// <summary>
		/// Retorna datasource de proyectos por cliente
		/// </summary>
		/// <param name="idCliente">id del cliente del cual se quiere regresar proyectos asociados</param>
		/// <returns></returns>
		public ILinqDataSource GetDataSourceProyectos(Guid idCliente)
		{
			ILinqDataSource dataSourceProyectos = _fabricaLinqDataSource.Construir();
			dataSourceProyectos.TableName = _nombreEntidadProyecto;
			dataSourceProyectos.Where = "IdCliente == Guid(\"" + idCliente.ToString() + "\")";
			dataSourceProyectos.EnableViewState = true;
			return dataSourceProyectos;
		}

		/// <summary>
		/// Retorna el datasource de estados de proyecto de un proyecto dado
		/// </summary>
		/// <param name="idProyecto">id del proyecto</param>
		/// <returns>Datasource de estados de proyecto</returns>
		public ILinqDataSource GetDataSourceEstadosProyectos(Guid idProyecto)
		{
			ILinqDataSource dataSourceEstadosProyectos = _fabricaLinqDataSource.Construir();
			dataSourceEstadosProyectos.TableName = _nombreEntidadEstadoProyecto;
			dataSourceEstadosProyectos.Where = "IdProyecto == Guid(\"" + idProyecto.ToString() + "\")";
			dataSourceEstadosProyectos.EnableViewState = true;
			return dataSourceEstadosProyectos;
		}

		///// <summary>
		///// Retorna datasource de proyectos por cliente
		///// </summary>
		///// <param name="idCliente">id del cliente del cual se quiere regresar proyectos asociados</param>
		///// <returns></returns>
		//public ILinqDataSource GetDataSourceCarpetasProyecto(Guid idProyecto)
		//{
		//   ILinqDataSource dataSourceCarpetasProyectos = _fabricaLinqDataSource.Construir();
		//   dataSourceCarpetasProyectos.TableName = _nombreEntidadCarpetaProyecto;
		//   dataSourceCarpetasProyectos.Where = "IdCliente == Guid(\"" + idCliente.ToString() + "\")";
		//   dataSourceCarpetasProyectos.EnableViewState = true;
		//   return dataSourceCarpetasProyectos;
		//}

		/// <summary>
		/// Obtiene el Id del proyecto por el nombre del proyecto y su cliente
		/// </summary>
		/// <param name="nombreProyecto">nombre del proyecto que se va a buscar</param>
		/// <param name="nombreCliente">nombre del cliente que se va a buscar</param>
		/// <returns>Id de proyecto, null si no lo encuentra</returns>
		public Guid? GetIdProyectoPorNombreNombreCliente(string nombreProyecto, string nombreCliente)
		{
			IEntidadLinqProyecto proyecto = _contexto.GetProyectoPorNombreConCliente(nombreProyecto, nombreCliente);
			if (proyecto != null)
				return proyecto.Id;
			else
				return null;
		}

		/// <summary>
		/// Obtiene el proyecto por el nombre del proyecto y su cliente
		/// </summary>
		/// <param name="nombreProyecto">nombre del proyecto que se va a buscar</param>
		/// <param name="nombreCliente">nombre del cliente que se va a buscar</param>
		/// <returns>proyecto</returns>
		public IEntidadLinqProyecto GetProyectoPorNombreNombreCliente(string nombreProyecto, string nombreCliente)
		{
			IEntidadLinqProyecto proyecto = _contexto.GetProyectoPorNombreConCliente(nombreProyecto, nombreCliente);

			return proyecto;
		}

		/// <summary>
		/// Obtiene el nombre de un proyecto dado su id
		/// </summary>
		/// <param name="idProyecto">id del proyecto a buscar</param>
		/// <returns></returns>
		public string GetNombreProyectoById(Guid idProyecto)
		{
			IEntidadLinqProyecto proyecto = _contexto.GetProyectoPorID(idProyecto);
			if (proyecto != null)
				return proyecto.Nombre;
			else
				return null;
		}
		#endregion

		#region IDisposable Members

		/// <summary>
		/// Implementación de dispose para administrador de proyectos
		/// </summary>
		public void Dispose()
		{
			if (_contexto != null)
				_contexto.Dispose();
		}
		#endregion


	}
}
